﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;

namespace Bramki
{
    public partial class Form1 : Form
    {
        /// <summary>
        /// ścieżka do pliku z zapisaną SSN
        /// </summary>
        protected String sciezkaSSN = "Bramki.dat";

        /// <summary>
        /// aktualnie wczytany obraz
        /// </summary>
        protected Image aktualnyObraz = null;

        public Form1()
        {
            //wymagane w celu współpracy z narzędziem Form Designer
            InitializeComponent();
            //wczytanie statycznych obrazków reprezentujących bramki logiczne
            pictureBox4.Image = Image.FromFile(@"res/OR.bmp");
            pictureBox5.Image = Image.FromFile(@"res/AND.bmp");
            pictureBox6.Image = Image.FromFile(@"res/XOR.bmp");
            pictureBox7.Image = Image.FromFile(@"res/NOT.bmp");
            pictureBox8.Image = Image.FromFile(@"res/NAND.bmp");
            pictureBox9.Image = Image.FromFile(@"res/NOR.bmp");
            //czyszczenie pól tekstowych z wynikami prawdopodobieństw
            label7.Text = null;
            label8.Text = null;
            label9.Text = null;
            label10.Text = null;
            label11.Text = null;
            label12.Text = null;
            //wyświetlenie startowego komunikatu
            label14.Text = "Wczytaj obraz z pliku (*.bmp).";
        }

        //Akcja przy "Wczytaj obraz" w menu "Plik"
        private void toolStripMenuItem1_Click(object sender, EventArgs e)
        {            
            label14.Text = "Wczytaj obraz z pliku (*.bmp).";//wyswietlenie komunikatu przy probie wczytania            
            OpenFileDialog okienko = new OpenFileDialog();  //nowa instancja okna dialogowego
            okienko.Filter = "Pliki graficzne (bmp)|*.bmp"; //filtrujemy bitmapy
            if (okienko.ShowDialog() == DialogResult.OK)    //jesli wybralismy obraz to
            {
                //czyscimy prawdopodobienstwa z etykietek
                label7.Text = label8.Text = label9.Text = label10.Text = label11.Text = label12.Text = null;
                aktualnyObraz = Image.FromFile(@okienko.FileName);          //wczytujemy obraz z pliku
                Image obrazek = Obraz.przeskaluj(aktualnyObraz, 200, 200);  //wstepne skalowanie obrazka
                pictureBox1.Image = obrazek;                                //wyswietlamy obrazek w programie
                //Tutaj 2 linie ktore potem pokazuja ze obrazek faktycznie zostal przeskalowany
                //bo widac ze sie zmniejsza
                pictureBox1.Height = pictureBox1.Image.Height;
                pictureBox1.Width = pictureBox1.Image.Width;
                //jesli wczytalismy obraz to wyswietlamy komunikat o mozliwosci analizy obrazu
                label14.Text = "Rozpocznij analizę bitmapy.";
                MessageBox.Show("Wybrano plik:\n" + okienko.FileName);      //wyswietlamy informacje o sciezce
            }
        }

        //Akcja przy "Analizuj obraz" w menu "Plik"
        private void toolStripMenuItem2_Click(object sender, EventArgs e)
        {
            //obsługa błędów 1 - nie wczytano obrazu przed analiza
            if (aktualnyObraz == null)
            {
                MessageBox.Show("Nie wybrano żadnej bitmapy!");
            }
            else
            {
                Hashtable wynik = new SSN(sciezkaSSN).wykonaj(aktualnyObraz);
                //obsługa błędów 2 - sprawdzenie, czy funkcja wykonaj() zwrocila wynik
                if (wynik == null)
                {
                    MessageBox.Show("Sztuczna sieć neuronowa nie działa!");
                }
                else
                {
                    label14.Text = "Wczytana przez Ciebie bitmapa\nzawiera obraz, którego podobieństwo\n" +
                                   "do bramek logicznych zostało określone\nodpowiednim prawdopodobieństwem.\n\n" +
                                   "Wyniki zaprezentowane są poniżej\nz dokładnością do 5 miejsc po przecinku.";
                    //wyciagniecie z wynikow prawdopodobienstw wszystkich bramek
                    String[] napisy = new String[6];
                    List<int> listaZwyciezcow=new List<int>();
                    double max=-1,tmp;
                    for(int i=0;i<6;++i){
                        napisy[i]=String.Format("{0:0.00000}", tmp=(Double)wynik[(SSN.Bramka)i]);
                        if(tmp>=max)
                            if(tmp==max)
                                listaZwyciezcow.Add(i);
                            else
                            {
                                listaZwyciezcow.Clear();
                                listaZwyciezcow.Add(i);
                                max=tmp;
                            }
                    }
                    if (max <= 0.0)
                        listaZwyciezcow.Clear();

                    int j = 0;
                    //wyswietlenie wynikow w oknie 
                    List<Label> lable = new List<Label>();
                    lable.Add(label7);
                    lable.Add(label8);
                    lable.Add(label9);
                    lable.Add(label10);
                    lable.Add(label11);
                    lable.Add(label12);

                    foreach (Label lab in lable)
                    {
                        if (listaZwyciezcow.Contains(j))
                            lab.Font = new Font(lab.Font, FontStyle.Bold);
                        else
                            lab.Font = new Font(lab.Font, FontStyle.Regular);
                        lab.Text = napisy[j++];
                    }
                    
                }
            }        
        }

        //Akcja przy "Zakoncz program" w menu "Plik"
        void toolStripMenuItem3_Click(object sender, EventArgs e)
        {
            this.Close();   //zamknięcie formy (programu)
        }

        //Akcja przy "O programie - pomoc" w menu "Pomoc"
        private void toolStripMenuItem4_Click(object sender, EventArgs e)
        {
            Form2 pomocnik = new Form2();   //tworzymy instancje nowej formy
            pomocnik.Show();                //wyswietlamy forme (nowe okienko)
        }

        //Akcja przy "Informacje" w menu "Pomoc"
        private void toolStripMenuItem5_Click(object sender, EventArgs e)
        {
            Form3 infos = new Form3();  //tworzymy instancje nowej formy
            infos.Show();               //wyswietlamy forme (nowe okienko)
        }
    }
}
